package init

import (
	"fmt"
	config2 "ginProject/config"
	"ginProject/config/global"
	"github.com/spf13/viper"
	"go.uber.org/zap"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"log"
	"os"
	"time"
)

func init() {
	//初始化日志
	InitLogger()
	//初始化配置项
	InitConfig()
	//初始化数据库
	InitMysql()
}

func InitLogger() {
	//zap日志库使用
	//初始化 实例化  开发环境
	zapConfig := zap.NewDevelopmentConfig()
	//指定要生成的日志路径
	zapConfig.OutputPaths = []string{
		"/Users/fuyx/GolandProjects/zg3-project/myProject.log",
		"stdout",
	}
	//构建 并返回一个logger
	logger, err := zapConfig.Build()
	if err != nil {
		panic(err)
		return
	}
	zap.ReplaceGlobals(logger)
}

func InitMysql() {
	//连接池
	// sprintf   %s string  %d int %f float  %v 任意类型
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		global.Config.Mysql.Username,
		global.Config.Mysql.Password,
		global.Config.Mysql.Host,
		global.Config.Mysql.Port,
		global.Config.Mysql.Dbname)
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold: time.Second,   // 慢 SQL 阈值
			LogLevel:      logger.Silent, // Log level
			Colorful:      false,         // 禁用彩色打印
		},
	)
	// 全局模式
	var err error
	global.Db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true,
		},
		Logger: newLogger,
	})
	if err != nil {
		zap.Error(err)
	}
	zap.S().Infow("Mysql started",
		zap.String("DB", "test"),
		zap.String("Host", "127.0.0.1"),
		zap.Int("Port", 3306))
}

func InitConfig() {
	// 初始化配置文件  通过viper去读取配置文件
	v := viper.New()
	v.SetConfigFile("/Users/fuyx/GolandProjects/zg3-project/application-dev.yaml") // 设置配置文件路径
	if err := v.ReadInConfig(); err != nil {
		zap.Error(err)
	}
	var config config2.Config
	if err := v.Unmarshal(&config); err != nil {
		zap.Error(err)
	}
	global.Config = config
	zap.S().Info("config initialized successfully!")
}
